<?php

class plugins_plugModel extends Model{

    protected $tabela = "plugin_plug";
    protected $pkey   = "cod_plugin";
    protected $dados  = array(
       
        'cod_plugin'  => array(
            'name'    => "cod_plugin",
            'pkey'    => true,
            'ai'      => true,
            'grid'    => true,
            'type'    => 'int',
            'display' => true,
            'private' => true,
            'notnull' => true
        ),
        'plugnome' => array(
            'name' 	=> 'Nome',
            'type' 	=> 'varchar',
            'especial'  => 'hide',
            'size' 	=> '50',
            'unique'    => array('model' => 'plugins/plug'),
            'notnull'   => true,
            'display'   => true,
            'grid'      => true,
        ),
        'pluglabel' => array(
            'name' 	=> 'Label',
            'type' 	=> 'varchar',
            'grid'      => true,
            'size' 	=> '32',
            'display'   => true,
            'notnull'   => true
        ),
        'status'    => array(
            'name'    => 'Status',
            'type'    => 'enum',
            'grid'    => true,
            'notnull' => true,
            'display' => true,
            'especial' => 'hide',
            'default' => 'desinstalado',
            'options' => array(
                'desinstalado' => 'desinstalado',
                'instalado'    => 'instalado',
                'desativado'   => 'desativado'
            )
        ),
        'isdefault' => array(
	    'name'    => 'Padrão',
	    'type'    => 'enum',
            'default' => 'n',
            'especial' => 'hide',
            'options' => array(
                's' => 'Sim',
                'n' => 'Não',
             ),
	    'grid'    => true,
            'notnull' => true,
	    'display' => true,
        ),
    );
    
    public function listPlugins($all = false){

        $this->LoadResource("files/dir", "dir");
        $diretorio = MODULOS;
        $plugins = $this->dir->getPastas($diretorio);
        asort($plugins);
        $exclude = array('Config', ".DS_Store");
        $out = array();

        $marr = $this->selecionar(array('plugnome'), "`status` != 'desinstalado'");
        //se não tem plugins
        if(empty($marr)) return array();
        $permitidos = array();
        foreach($marr as $temp){
            $permitidos[] = $temp['plugnome'];
        }

        $this->LoadModel('usuario/login', 'user');
        if(!$this->user->UserIsWebmaster()) $exclude[] = 'admin';
        foreach($plugins as $plugin){
            
            //se é proibido, continua
            if(in_array($plugin, $exclude)) continue;

            //se não é permitido, continua
            if(!in_array($plugin, $permitidos) && $all == false) continue;
            
            $out[$plugin]  = array($plugin => $plugin);
            $subplugins    = $this->dir->getPastas($diretorio . "$plugin");
            asort($subplugins);
            $total = 0;

            foreach($subplugins as $splugin){
                if(in_array($splugin, $exclude)) continue;
                $file = $diretorio . "$plugin/$splugin/classes/{$splugin}Admin.php";
                if(file_exists($file)) {
                    $this->LoadConfigFromPlugin($plugin);
                    $total++;
                    $name = ($splugin == "index")?$plugin:$splugin;
                    $out[$plugin][$name] = "$plugin/$splugin";
                }
            }
            
            if($total == 0 && !$all) {unset($out[$plugin]);}
        }

        return $out;
    }
    
    public function findPlugins(){
        $this->LoadResource("files/dir", "dir");
        $diretorio = MODULOS;
        $files = $this->dir->getPastas($diretorio);
        
        $out = array();
        foreach($files as $nfile){
            if($nfile == ".DS_Store") continue;
            $out[$nfile] = $nfile;
        }
        return $out;
    }
    
    public function IsAvaible($plugnome){
        
        $total = $this->getCount("plugnome = '$plugnome' AND status = 'instalado'");
        if($total == 0){
            $total = $this->getCount("plugnome = '$plugnome'");
            if($total == 0){
                $var = $this->listPlugins();
                if(empty ($var) ||!array_key_exists($plugnome, $var)){
                    $var = $this->findPlugins();
                    if(empty ($var) ||!array_key_exists($plugnome, $var)){
                        throw new PageNotFoundException();
                    }//else throw new PageBlockedException();
                    else throw new PageBuildingException();
                }

                //print_r($var[$plugnome]);
                //$modulo = array_shift($var[$plugnome]);
                $this->LoadModel("admin/install", 'iobj');
                if(!$this->iobj->install($plugnome)){
                    throw new modelException("pluginModel", $this->iobj->getErrorMessage());
                    return false;
                }   
            }else{
                $plugin = $this->selecionar(array('status'), "plugnome = '$plugnome'");
                if(!empty($plugin)) $plugin = array_shift ($plugin);
                else $plugin['status'] = 'desinstalado';
                if($plugin['status'] == "desinstalado") throw new PageBlockedException();
                //if($plugin['status'] == "desativado")   
                throw new PageBuildingException();
            }
        }
        return true;
    }

    public function IsRegistered($plugnome){
        $plugin = $this->getItem($plugnome, 'plugnome');
        return (!empty ($plugin));
    }
    
    public function setSubplugins(){
        $this->LoadModel('plugins/subplugin', 'sub');
        $list    = $this->listPlugins(true);
        $keys    = array_keys($list);
        $var     = implode("','", $keys);
        $subs    = $this->sub->selecionar();
        
        $temp    = array();
        if(!empty($subs)) 
            foreach($subs as $sub) 
                $temp[$sub['model']] = $sb;
        
        $plugins = $this->selecionar(array($this->pkey, 'plugnome'), "plugnome IN('$var')");
        foreach($plugins as $plugin){
            if(!array_key_exists($plugin['plugnome'], $list)) continue;
            
            foreach($list[$plugin['plugnome']] as $model){
                
                if(array_key_exists($model, $temp)) continue;
                $arr['model']      = $model;
                $arr['cod_plugin'] = $plugin[$this->pkey];
                $file = MODULOS.$model.'/description.php';
                if(file_exists($file)){
                    require_once $file;
                    $md = str_replace('/', '_', $model) . "Desc";
                    $obj = new $md();
                    $arr['splabel']   = $obj->getLabel();
                    $arr['descricao'] = $obj->getDescription();
                }
                
                if(!$this->sub->inserir($arr))
                    echo $this->sub->getErrorMessage() . "<br/>";
                $arr = array();
            }
            
        }
    }
    
    public function editar($id, $post, $camp = "") {
        
        if(array_key_exists('status', $post) && $post['status'] == 'desinstalado'){
            $camp  = ($camp == "")?$this->pkey:$camp;
            $dados = $this->selecionar(array(), "$camp = '$id'");
            if(empty($dados)) {
                $this->setErrorMessage("O plugin que você está tentando desinstalar não existe");
                return false;
            }
            $dados = array_shift($dados);
            $observers = array('plugins/permissao', 'plugins/model');
            foreach($observers as $observername){
                $this->LoadModel($observername, 'md');
                if(!$this->md->unstall($dados['cod_plugin'])){
                    $erro = "Não foi possível desinstalar o plugin. <br/><br/>";
                    $this->setErrorMessage($erro . $this->md->getErrorMessage());
                    return false;
                }
            }
        }
        return parent::editar($id, $post, $camp);
    }
    
    public function getDefault(){
        if(!cookie::cookieExists('MODULE_DEFAULT')){
            $var = $this->selecionar(array('plugnome'), "default = 's'", 1);
            if(empty($var)) $var[]['plugnome'] = "usuario";
            cookie::setVar('MODULE_DEFAULT', $var);
        }
        else $var = cookie::getVar('MODULE_DEFAULT');
        $v = array_shift($var);
        return $v['plugnome'];
    }
    
    public function setDefault($cod_item){
         $this->db->ExecuteQuery("
            UPDATE $this->tabela SET isdefault = 'n'; 
            UPDATE $this->tabela SET isdefault = 's' WHERE $this->pkey = '$cod_item'; 
        ");
    }
    
    public function paginate($page, $link = "", $cod_item = "", $campo = "", $qtd = 20, $campos = array(), $adwhere = "", $order = "") {
        $order = ($order == "")?"plugnome ASC":$order;
        return parent::paginate($page, $link, $cod_item, $campo, $qtd, $campos, $adwhere, $order);
    }
}

?>